home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / mus / play / tracker_3_19.lzh / tracker / soundblaster_audio.c < prev    next >
C/C++ Source or Header  |  1993-11-17  |  3KB  |  135 lines

  1. /* soundblaster_audio.c */
  2. /* IMPORTANT NOTE: I can't check that this file works.
  3.  */
  4.  
  5. /* $Id: soundblaster_audio.c,v 3.4 1993/11/17 15:31:16 espie Exp espie $
  6.  * $Log: soundblaster_audio.c,v $
  7.  * Revision 3.4  1993/11/17  15:31:16  espie
  8.  * *** empty log message ***
  9.  *
  10.  * Revision 3.3  1992/12/03  15:00:50  espie
  11.  * restore stty.
  12.  *
  13.  * Revision 3.1  1992/11/19  20:44:47  espie
  14.  * Protracker commands.
  15.  *
  16.  * Revision 3.0  1992/11/18  16:08:05  espie
  17.  * New release.
  18.  *
  19.  * Revision 1.5  1992/11/17  15:38:00  espie
  20.  * Dummy discard_buffer()
  21.  * Added stereo option (kind of).
  22.  */
  23.  
  24. #include <malloc.h>
  25. #include <stdio.h>
  26. #include "defs.h"
  27. #include "extern.h"
  28. #include <i386at/sblast.h>
  29.  
  30. LOCAL char *id = "$Id: soundblaster_audio.c,v 3.4 1993/11/17 15:31:16 espie Exp espie $";
  31.  
  32. LOCAL unsigned char *buffer;/* buffer for ready-to-play samples */
  33. LOCAL int buf_index;   /* can't call this index, conflicts with index(3) */
  34. FILE *audio;            /* /dev/sb_dsp */
  35.  
  36. /* are we playing stereo or not ? */
  37. LOCAL int stereo;
  38. /* 256th of primary/secondary source for that side. */
  39. LOCAL int primary, secondary;
  40.  
  41. void set_mix(percent)
  42. int percent;
  43.     {
  44.     percent *= 256;
  45.     percent /= 100;
  46.     primary = percent;
  47.     secondary = 512 - percent;
  48.     }
  49.  
  50. int open_audio(f, s)
  51. int f;
  52. int s;
  53.     {
  54.     audio = fopen("/dev/sb_dsp", "w");
  55.     if (!audio)
  56.         {
  57.         perror("Error opening audio device");
  58.         end_all();
  59.         }
  60.  
  61.     stereo = s;
  62.     if (ioctl(fileno(audio), DSP_IOCTL_STEREO, stereo) == -1)
  63.         {
  64.         perror("Error setting stereo/mono");
  65.         end_all();
  66.         }
  67.  
  68.     if (stereo)
  69.         f *= 2;     /* XXX Stereo takes twice the speed */
  70.  
  71.     if (f == 0)
  72.         f = -1;     /* read current frequency from driver */
  73.  
  74.     if (ioctl(fileno(audio), DSP_IOCTL_SPEED, &f) == -1)
  75.         {
  76.         perror("Error setting frequency");
  77.         end_all();
  78.         }
  79.  
  80.     buffer = malloc(sizeof(SAMPLE) * f);    /* Stereo makes x2 */
  81.     buf_index = 0;
  82.  
  83.     if (stereo)         /* tacky, I know.. */
  84.         return f/ 2;
  85.     else
  86.         return f;
  87.     }
  88.  
  89. void output_samples(left, right)
  90. int left, right;
  91.     {
  92.     if (stereo)
  93.         {
  94.         buffer[buf_index++] = (((left * primary + right * secondary) / 256)
  95.              + (1 << 15)) >> 8;
  96.         buffer[buf_index++] = (((right * primary + left * secondary) / 256)
  97.              + (1 << 15)) >> 8;
  98.         }
  99.     else
  100.         buffer[buf_index++] = (left + right + (1 << 15)) >> 8;
  101.     }
  102.  
  103. void discard_buffer()
  104.     {
  105.     /* not implemented */
  106.     }
  107.  
  108. void flush_buffer()
  109.     {
  110.     if (fwrite(buffer, sizeof(*buffer), buf_index, audio) != buf_index)
  111.         fprintf(stderr, "fwrite didn't write all the bytes?\n");
  112.     buf_index = 0;
  113.     }
  114.  
  115. /*
  116.  * Closing the BSD SBlast sound device waits for all pending samples to play.
  117.  * I think SysV aborts, so you might have to flush manually with ioctl()
  118.  */
  119. void close_audio()
  120.     {
  121.     fclose(audio);
  122.     free(buffer);
  123.     }
  124.  
  125. int update_frequency()
  126.     {
  127.     /* not implemented */
  128.     return 0;
  129.     }
  130.  
  131. void set_synchro()
  132.     {
  133.     /* not implemented */
  134.     }
  135.